<template>
  <div>
    <div class="page-header">
      <h2 style="margin-top: 0;">统计分析</h2>
      <p class="description">
        查看项目评审结果统计与分析（按去掉1个最高分、1个最低分计算算术平均分，保留3位小数）
      </p>
    </div>

    <!-- 1. 专业组选项卡（替换原下拉框，去掉全部专业组） -->
    <el-tabs v-model="activeSpecialty" type="card" style="margin-bottom: 15px;">
      <el-tab-pane label="油气勘探" name="油气勘探"></el-tab-pane>
      <el-tab-pane label="油气藏工程" name="油气藏工程"></el-tab-pane>
      <el-tab-pane label="钻采与地面工程" name="钻采与地面工程"></el-tab-pane>
      <el-tab-pane label="信息工程" name="信息工程"></el-tab-pane>
    </el-tabs>

    <!-- 2. 筛选控制区（保留申报等级筛选+排序+下载按钮，统一风格） -->
    <div class="card-container" style="margin-bottom: 20px;">
      <div class="filter-bar" style="display: flex; justify-content: space-between; align-items: center;">
        <!-- 左侧筛选框 -->
        <div class="filter-group" style="display: flex; gap: 16px; align-items: center;">
          <!-- 申报等级筛选 -->
          <el-select
              v-model="statFilter.level"
              placeholder="选择申报等级"
              style="width: 200px;"
              @change="fetchScoreData"
          >
            <el-option label="全部等级" value=""></el-option>
            <el-option label="一等奖" value="一等奖"></el-option>
            <el-option label="二等奖" value="二等奖"></el-option>
            <el-option label="三等奖" value="三等奖"></el-option>
          </el-select>
        </div>

        <!-- 右侧：排序+下载按钮（与评委页面按钮风格一致） -->
        <div style="display: flex; gap: 10px; align-items: center;">
          <!-- 排序控制 -->
          <el-select
              v-model="sortConfig.order"
              placeholder="排序方式"
              style="width: 180px;"
              @change="handleSortChange"
          >
            <el-option label="平均分从高到低" value="desc"></el-option>
            <el-option label="平均分从低到高" value="asc"></el-option>
          </el-select>

          <!-- 下载按钮（统一评委页面的按钮样式：info类型+图标） -->
          <el-button
              type="info"
              icon="el-icon-download"
              @click="handleExportExcel"
              :disabled="displayTableData.length === 0"
          >
            下载统计表格
          </el-button>
        </div>
      </div>
    </div>

    <!-- 3. 统计汇总表格区 -->
    <div class="card-container">
      <!-- 统计汇总表格（表头样式、加载态统一） -->
      <el-table
          :data="displayTableData"
          border
          style="width: 100%;"
          :header-cell-style="{background: '#f5f7fa', fontWeight: 'bold'}"
          v-loading="loading"
          element-loading-text="正在加载统计数据..."
      >
        <!-- 序号 -->
        <el-table-column
            type="index"
            label="序号"
            width="60"
            align="center"
        ></el-table-column>
        <!-- 成果名称 -->
        <el-table-column
            prop="projectName"
            label="成果名称"
            min-width="250"
        ></el-table-column>
        <!-- 申报单位 -->
        <el-table-column
            prop="deptName"
            label="申报单位"
            min-width="200"
        ></el-table-column>
        <!-- 申报等级 -->
        <el-table-column
            prop="declareLevel"
            label="申报等级"
            width="120"
            align="center"
        >
          <template slot-scope="scope">
            <el-tag :type="getLevelTagType(scope.row.declareLevel)">
              {{ scope.row.declareLevel }}
            </el-tag>
          </template>
        </el-table-column>
        <!-- 专业 -->
        <el-table-column
            prop="specialty"
            label="专业"
            width="150"
            align="center"
        ></el-table-column>
        <!-- 动态专家列（根据所有数据的专家列表生成） -->
        <el-table-column
            v-for="(expert, idx) in allExpertNames"
            :key="idx"
            :label="expert"
            width="120"
            align="center"
        >
          <template slot-scope="scope">
            <!-- 找到当前项目对应专家的评分 -->
            <template v-if="scope.row.expertScores[expert]">
              <span v-if="scope.row.expertScores[expert] === '未提交'" style="color: #ff4d4f;">
                未提交
              </span>
              <span v-else>
                {{ typeof scope.row.expertScores[expert] === 'number'
                  ? scope.row.expertScores[expert].toFixed(2)
                  : scope.row.expertScores[expert] }}
              </span>
            </template>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <!-- 总分 -->
        <el-table-column
            prop="finalAvgScore"
            label="总分（去最高去最低平均）"
            width="180"
            align="center"
        >
          <template slot-scope="scope">
            <span v-if="scope.row.finalAvgScore === '无效'" style="color: #ff4d4f; font-weight: bold;">
              {{ scope.row.finalAvgScore }}
            </span>
            <span v-else style="color: #1890ff; font-weight: bold;">
              {{ scope.row.finalAvgScore.toFixed(3) }}
            </span>
          </template>
        </el-table-column>
      </el-table>

      <!-- 无数据提示（统一风格） -->
      <div v-if="!loading && displayTableData.length === 0" class="empty-data">
        <el-empty description="暂无相关评分数据"></el-empty>
      </div>
    </div>
  </div>
</template>

<script>
import { getAwardReviewSimple, exportReviewExcel } from '@/api/score'

export default {
  data() {
    return {
      // 活跃的专业组选项卡（默认选中第一个：油气勘探）
      activeSpecialty: '油气勘探',
      // 筛选条件（专业组从选项卡获取，不再单独维护）
      statFilter: {
        level: ''      // 申报级别
      },
      // 排序配置
      sortConfig: {
        order: 'desc' // desc（从高到低）/ asc（从低到高）
      },
      // 加载状态
      loading: false,
      // 原始接口数据
      rawScoreData: [],
      // 所有专家名称列表（去重后）
      allExpertNames: [],
      // 处理后用于显示的表格数据
      displayTableData: []
    }
  },
  watch: {
    // 监听选项卡变化，重新获取数据
    activeSpecialty: {
      immediate: true, // 初始化时触发一次（加载第一个选项卡数据）
      handler() {
        this.fetchScoreData()
      }
    }
  },
  methods: {
    /**
     * 获取评分数据（专业组参数从选项卡获取）
     */
    async fetchScoreData() {
      this.loading = true
      try {
        // 构造请求参数（专业组取选项卡的值，空字符串时不传递）
        const params = {
          specialty: this.activeSpecialty // 必传当前选中的专业组
        }
        if (this.statFilter.level) params.level = this.statFilter.level

        const response = await getAwardReviewSimple(params)
        if (response.code === '200' && response.data) {
          this.rawScoreData = response.data
          // 处理数据（提取所有专家、计算评分等）
          this.processScoreData()
        } else {
          this.rawScoreData = []
          this.allExpertNames = []
          this.displayTableData = []
          this.$message.warning('获取数据失败，请重试')
        }
      } catch (error) {
        console.error('获取评分数据异常：', error)
        this.rawScoreData = []
        this.allExpertNames = []
        this.displayTableData = []
        this.$message.error('网络异常，获取数据失败')
      } finally {
        this.loading = false
      }
    },

    /**
     * 处理原始数据：提取专家列表、计算各项评分
     */
    processScoreData() {
      if (!this.rawScoreData.length) {
        this.allExpertNames = []
        this.displayTableData = []
        return
      }

      // 1. 提取所有专家名称（去重，保持顺序）
      const expertSet = new LinkedHashSet()
      this.rawScoreData.forEach(item => {
        item.experts.forEach(expert => {
          expertSet.add(expert.expertName)
        })
      })
      this.allExpertNames = Array.from(expertSet)

      // 2. 处理每个项目的数据
      const processedData = this.rawScoreData.map(project => {
        // 构造专家评分映射（key: 专家名称，value: 总分或"未提交"）
        const expertScores = {}
        // 用于计算总分的有效评分列表
        const validTotalScores = []

        this.allExpertNames.forEach(expertName => {
          const expert = project.experts.find(e => e.expertName === expertName)
          if (expert) {
            // scoreStatus !== 3 表示未提交
            if (expert.scoreStatus !== 3) {
              expertScores[expertName] = '未提交'
            } else {
              // 计算三项得分总和（处理null值为0）
              const bgScore = expert.bgScore || 0
              const innovationScore = expert.innovationScore || 0
              const economicScore = expert.economicScore || 0
              const total = bgScore + innovationScore + economicScore
              expertScores[expertName] = total
              validTotalScores.push(total)
            }
          } else {
            expertScores[expertName] = '-'
          }
        })

        // 3. 计算最终平均分（去最高去最低）
        let finalAvgScore = '无效'
        if (validTotalScores.length >= 3) {
          // 排序后去掉最高最低分
          const sortedScores = [...validTotalScores].sort((a, b) => a - b)
          sortedScores.shift() // 去最低
          sortedScores.pop()   // 去最高

          // 计算平均分（保留3位小数）
          const sum = sortedScores.reduce((acc, curr) => acc + curr, 0)
          finalAvgScore = sum / sortedScores.length
        }

        return {
          ...project,
          expertScores,
          finalAvgScore
        }
      })

      // 4. 应用排序
      this.displayTableData = this.sortTableData(processedData)
    },

    /**
     * 表格数据排序
     * @param {Array} data - 待排序数据
     * @returns {Array} 排序后的数据
     */
    sortTableData(data) {
      return [...data].sort((a, b) => {
        // 无效分数排在后面
        if (a.finalAvgScore === '无效' && b.finalAvgScore !== '无效') return 1
        if (a.finalAvgScore !== '无效' && b.finalAvgScore === '无效') return -1
        if (a.finalAvgScore === '无效' && b.finalAvgScore === '无效') return 0

        // 按平均分排序
        return this.sortConfig.order === 'desc'
            ? b.finalAvgScore - a.finalAvgScore
            : a.finalAvgScore - b.finalAvgScore
      })
    },

    /**
     * 排序方式改变时触发
     */
    handleSortChange() {
      this.displayTableData = this.sortTableData(this.displayTableData)
    },

    /**
     * 下载统计表格
     */
    async handleExportExcel() {
      if (this.displayTableData.length === 0) {
        this.$message.warning('暂无数据可导出')
        return
      }

      this.loading = true
      try {
        // 构造请求参数（与当前筛选条件一致）
        const params = {
          specialty: this.activeSpecialty
        }
        if (this.statFilter.level) params.level = this.statFilter.level

        const response = await exportReviewExcel(params)
        // 处理文件下载
        // const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' })
        const blob = new Blob([response], {
          type: 'application/vnd.ms-excel'
        })
        const fileName = `${this.activeSpecialty}-评分汇总表.xls` // 文件名包含专业组

        // 创建下载链接
        const url = window.URL.createObjectURL(blob)
        const a = document.createElement('a')
        a.href = url
        a.download = fileName
        document.body.appendChild(a)
        a.click()

        // 释放资源
        window.URL.revokeObjectURL(url)
        document.body.removeChild(a)

        this.$message.success('下载成功')
      } catch (error) {
        console.error('导出Excel异常：', error)
        this.$message.error('导出失败，请重试')
      } finally {
        this.loading = false
      }
    },

    /**
     * 获取申报等级标签类型（统一评委页面的标签风格）
     */
    getLevelTagType(level) {
      const typeMap = {
        '一等奖': 'primary',
        '二等奖': 'success',
        '三等奖': 'info'
      }
      return typeMap[level] || 'info'
    }
  }
}

// 辅助类：保持插入顺序的Set
class LinkedHashSet {
  constructor() {
    this.map = new Map()
  }
  add(value) {
    this.map.set(value, true)
  }
  values() {
    return this.map.keys()
  }
  [Symbol.iterator]() {
    return this.values()
  }
}
</script>

<style scoped>
/* 统一评委页面的页面头部样式 */
.page-header {
  margin-bottom: 20px;
}
.page-header .description {
  color: #86909c;
  margin-bottom: 0;
}

/* 统一卡片容器样式 */
.card-container {
  background: #fff;
  border-radius: 4px;
  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
  padding: 20px;
}

/* 无数据提示样式 */
.empty-data {
  text-align: center;
  padding: 50px;
  color: #86909c;
}

/* 筛选栏样式优化 */
.filter-bar {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

/* 适配小屏幕 */
@media (max-width: 1200px) {
  .filter-bar {
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
  }
  .filter-bar > div {
    width: 100%;
  }
}
</style>